package Controller

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"log"
	"m/Global"
	"m/model"
	"net/http"
)

func RegisterZupu(context *gin.Context) {
	// 使用结构体来获取参数
	var requsetZupu = model.Zupu{}
	json.NewDecoder(context.Request.Body).Decode(&requsetZupu)
	fmt.Println("获取到的数据：", requsetZupu.Zno, requsetZupu.Zname, requsetZupu.Zlevel, requsetZupu.Zcharacter, requsetZupu.Zaddress, requsetZupu.Zdie, requsetZupu.Zmarry, requsetZupu.Zpartner, requsetZupu.Zlife, requsetZupu.Zbirth, requsetZupu.Zchild, requsetZupu.Zhonor)

	// 获取参数
	fmt.Println("开始获取教师参数...")
	zno := requsetZupu.Zno
	zname := requsetZupu.Zname
	zlevel := requsetZupu.Zlevel
	zcharacter := requsetZupu.Zcharacter
	zaddress := requsetZupu.Zaddress
	zdie := requsetZupu.Zdie
	zmarry := requsetZupu.Zmarry
	zpartner := requsetZupu.Zpartner
	zlife := requsetZupu.Zlife
	tbirth := requsetZupu.Zbirth
	tchild := requsetZupu.Zchild
	thonor := requsetZupu.Zhonor

	// 数据验证
	fmt.Println("开始验证家谱数据...")
	fmt.Println("家谱编号：", zno, "家谱名字：", zname, "家谱等级：", zlevel, "家谱特征：", zcharacter, "族长联系方式：", zaddress, "家训：", zdie, "结婚日期：", zmarry, "配偶信息：", zpartner, "生平事迹：", zlife, "出生日期：", tbirth, "子女信息：", tchild, "生前荣誉：", thonor)
	if len(zno) == 0 {
		//context.JSON(http.StatusUnprocessableEntity, gin.H{"code":421, "msg":"家谱号不可为空！"})
		fmt.Println("发现家谱编号为空")
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "家谱编号不能为空",
		})
		return
	}

	if len(zname) == 0 {
		//context.JSON(http.StatusUnprocessableEntity, gin.H{"code":422, "msg":"家谱名不可为空！"})
		fmt.Println("发现家谱名字为空")
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "家谱名字不能为空",
		})
		return
	}
	fmt.Println(zno, zname, zlevel, zcharacter, zaddress)
	log.Println(zno, zname, zlevel, zcharacter, zaddress)
	// 判断教师号是否存在
	//tempZno, err := strconv.Atoi(zno)
	if isZnoExists(Global.Db, zno) == true {
		//context.JSON(http.StatusUnprocessableEntity, gin.H{"code":422, "msg":"教师号已经存在！"})
		// 直接返回，不执行下面的create了
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "成员编号已经存在",
		})
		return
	}
	// 创建成员
	//if err != nil {
	//	fmt.Println("错误")
	//	return
	//}
	newZupu := model.Zupu{
		Zno:        zno,
		Zname:      zname,
		Zlevel:     zlevel,
		Zcharacter: zcharacter,
		Zaddress:   zaddress,
		Zdie:       zdie,
		Zmarry:     zmarry,
		Zpartner:   zpartner,
		Zlife:      zlife,
		Zbirth:     tbirth,
		Zchild:     tchild,
		Zhonor:     thonor,
	}

	//	Global.Db.Create(&newZupu)
	//	//返回结果
	//	context.JSON(200, gin.H{
	//		"msg": "插入成功",
	//	})
	//}

	if err := Global.Db.Create(&newZupu).Error; err != nil {
		context.JSON(201, gin.H{
			"code": 201,
			"msg":  "插入家谱失败",
		})
	} else {
		context.JSON(200, gin.H{
			"code": 200,

			"msg": "插入家谱成功",
		})
	}
}

func ShowZupu(context *gin.Context) {
	fmt.Println("进入showzupu")
	var zupu []model.Zupu
	err := Global.Db.Find(&zupu).Error
	if err != nil {
		fmt.Println("查询全体家族成员出错！")
		return
	}
	fmt.Println("数据库查到的全体家族成员信息：", zupu)

	//token, err := Global.ReaeaseTokec3(zupu)
	context.JSON(http.StatusOK, zupu)
}

func CountZupu(context *gin.Context) {
	// 调用存储过程
	var count int
	Global.Db.Raw("select count_zupu()").First(&count)
	fmt.Println("成员数量：", count)
	context.JSON(200, gin.H{
		"code": 200,
		"msg":  "返回家族成员数量成功",
		"data": count,
	})
}

func EditZupu(context *gin.Context) {
	fmt.Println("进入editzupu")
	var requestZupu = model.Zupu{}
	json.NewDecoder(context.Request.Body).Decode(&requestZupu)
	fmt.Println("即将编辑家族成员编号：", requestZupu.Zno)

	if len(requestZupu.Zno) < 1 {
		fmt.Println("家族成员编号不能为空！", len(requestZupu.Zno))
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "家族成员编号不能为空",
		})
		return
	}
	if len(requestZupu.Zname) < 1 {
		fmt.Println("成员姓名不能为空！", len(requestZupu.Zname))
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "成员姓名不能为空",
		})
		return
	}
	//if len(requestZupu.Zlevel) < 1 {
	//	fmt.Println("家族成员等级不能为空！", len(requestZupu.Zlevel))
	//	context.JSON(200, gin.H{
	//		"code": 200,
	//		"msg":  "家族成员等级不能为空",
	//	})
	//	return
	//}
	//if len(requestZupu.Zcharacter) < 1 {
	//	fmt.Println("成员特长不能为空！", len(requestZupu.Zcharacter))
	//	context.JSON(200, gin.H{
	//		"code": 200,
	//		"msg":  "成员特长不能为空",
	//	})
	//	return
	//}

	//// 教师号是否存在
	//var zupu model.Zupu
	//Global.Db.Where("zno = ?", requestZupu.Zno).First(&zupu)
	//fmt.Println("zupu.Zno=", zupu.Zno)
	//if zupu.Zno == "" {
	//	context.JSON(200, gin.H{
	//		"code": 200,
	//		"msg":  "找不到此家族成员",
	//	})
	//	return
	//}
	//Global.Db.Save(&requestZupu)
	//Global.Db.Model(&requestZupu).Updates(model.Zupu{
	//	Zno: requestZupu.Zno,
	//	Zname: requestZupu.Zname,
	//	Zlevel: requestZupu.Zlevel,
	//	Zcharacter: requestZupu.Zcharacter,
	//})
	err := Global.Db.Where("zno = ?", requestZupu.Zno).Updates(&requestZupu).Error
	if err != nil {
		fmt.Println("更新成员出错")
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "更新出错",
		})
		return
	}

	context.JSON(200, gin.H{
		"code": 200,
		"msg":  "更新成功",
	})

}

func DeleteZupu(context *gin.Context) {
	fmt.Println("进入deletezupu")
	var requestZupu = model.Zupu{}
	json.NewDecoder(context.Request.Body).Decode(&requestZupu)
	fmt.Println("即将删除成员编号：", requestZupu.Zno)

	if len(requestZupu.Zno) < 1 {
		fmt.Println("成员编号不能为空！", len(requestZupu.Zno))
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "成员编号不能为空",
		})
		return
	}
	// 教师号是否存在
	var zupu model.Zupu
	Global.Db.Where("zno = ?", requestZupu.Zno).First(&zupu)
	fmt.Println("zupu.Zno=", zupu.Zno)
	if zupu.Zno == "" {
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "找不到此成员",
		})
		return
	}
	// 首先删除有这个老师的课程
	var relation = model.Relation{
		Zno: requestZupu.Zno,
	}
	var err error
	err = Global.Db.Where("zno = ?", requestZupu.Zno).Delete(&relation).Error
	if err != nil {
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "删除此教师所教授的课程出错",
		})
		return
	}

	// 其次删除这个老师
	err = Global.Db.Where("zno = ?", requestZupu.Zno).Delete(&zupu).Error
	if err != nil {
		context.JSON(200, gin.H{
			"code": 200,
			"msg":  "删除成员出错",
		})
		return
	}

	context.JSON(200, gin.H{
		"code": 200,
		"msg":  "删除成功",
	})
}

func ShowZupuSelect(context *gin.Context) {
	fmt.Println("进入showteacheerselect")
	var requestZupu = model.Zupu{}
	json.NewDecoder(context.Request.Body).Decode(&requestZupu)
	fmt.Println("即将搜索成员编号：", requestZupu.Zno)

	if len(requestZupu.Zno) < 1 {
		fmt.Println("成员编号不能为空！", len(requestZupu.Zno))
		context.JSON(http.StatusUnprocessableEntity, gin.H{
			"code": 422,
			"msg":  "成员编号为空",
		})
		return
	}
	// 家族成号是否存在
	var zupu []model.Zupu
	Global.Db.Where("zno = ?", requestZupu.Zno).First(&zupu)
	fmt.Println("zupu.Zno=", zupu[0].Zno)
	if zupu[0].Zno == "" {
		context.JSON(http.StatusUnprocessableEntity, gin.H{
			"code": 422,
			"msg":  "找不到此家族成员！",
		})
		return
	}
	context.JSON(http.StatusOK, zupu)

}

func ShowZupuDelete(context *gin.Context) {
	fmt.Println("进入showzupudelete")
	//var requesetZupu = model.Zupu{}
}

func isZnoExists(db *gorm.DB, zno string) bool {
	var zupu model.Zupu
	err := db.Where("zno = ?", zno).Find(&zupu).Error
	if err != nil {
		fmt.Println("err执行")
		return false
	}
	fmt.Println("数据库返回的教师号：", zupu.Zno)
	if zupu.Zno != "" { // 找到重复的教师号
		fmt.Println("找到重复的教师号为：", zupu.Zno)
		fmt.Println("成员执行了if")
		return true
	} else {
		fmt.Println("成员执行了else")
		return false
	}
}
